home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
data
/
etc
/
lboss01.lzh
/
enemy.c
next >
Wrap
C/C++ Source or Header
|
1999-04-22
|
10KB
|
489 lines
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <XSP2lib.H>
#include "main.h"
#include "enemy.h"
#include "fxsp2lib.h"
#include "parts.h"
#define ENEMY_MAX 256 /* 最大数 */
#define P1_K 0.5 /* ばね定数(左右大パーツ) */
#define P1_M 0.2 /* 摩擦計数(左右大パーツ) */
#define P1_V 0.5 /* 速度がこれ以下なら次へ(左右大パーツ) */
#define P1_L 0.4 /* 座標がこれ以下なら次へ(左右大パーツ) */
#define P2_K 2.9 /* ばね定数(左右上小パーツ) */
#define P2_M 0.06 /* 摩擦計数(左右上小パーツ) */
#define P2_V 0.1 /* 速度がこれ以下なら次へ(左右上小パーツ) */
#define P2_L 0.1 /* 座標がこれ以下なら次へ(左右上小パーツ) */
#define P2_S 22 /* seq_counter がこれになったら動作開始(左右上小パーツ) */
#define P3_K 1.5 /* ばね定数(左右下小パーツ) */
#define P3_M 0.06 /* 摩擦計数(左右下小パーツ) */
#define P3_V 0.1 /* 速度がこれ以下なら次へ(左右下小パーツ) */
#define P3_L 0.1 /* 座標がこれ以下なら次へ(左右下小パーツ) */
#define P3_S 40 /* seq_counter がこれになったら動作開始(左右下小パーツ) */
static ENEMY *enemy_top, /* 使用中のワークのリスト */
*enemy_null_top, /* 空のワークのリスト */
*enemy_end; /* 使用中ワークのリストの末尾 */
static ENEMY enemy[ENEMY_MAX]; /* ワーク */
extern char end_of_data;
typedef struct _spwork {
signed short x, y; /* 座標 */
unsigned short pt; /* スプライトパターンNo. */
unsigned short info; /* 反転コード・色・優先度を表わすデータ */
} SPWORK;
SPWORK spwork;
int EnemyInit0 (void)
{
int i;
/* リストをつなげる */
enemy_top = NULL;
enemy_end = NULL;
enemy_null_top = enemy;
for (i = 0; i < ENEMY_MAX; i++)
enemy[i].next = &enemy[i + 1];
enemy[ENEMY_MAX - 1].next = NULL;
return (0);
}
void EnemyInit (unsigned short type, unsigned short info,
signed short ox, signed short oy, ENEMY * parent)
{
ENEMY *p;
if (enemy_null_top == NULL) {
printf ("ワークが一杯です\n");
return; /* 空きのワークがない(キャラクターオーバー) */
}
/* リストの末尾に新しいノードを追加 */
p = enemy_null_top;
enemy_null_top = p->next;
if (enemy_top == NULL)
enemy_top = p;
else
enemy_end->next = p;
p->next = NULL;
enemy_end = p;
p->type = type;
p->info = info;
p->ox = ox;
p->oy = oy;
p->x = 0;
p->y = 0;
p->parent = parent;
p->lx = 0.0;
p->ly = 0.0;
p->lz = 0.0;
p->vx = 0.0;
p->vy = 0.0;
p->vz = 0.0;
p->cyc = 0;
p->cyc1 = 0;
switch (p->type) {
case 0: /* 本体 */
EnemyInit (1, 0x0432, -48, 16, p); /* 左大パーツ */
EnemyInit (2, 0x0432, 32, 16, p); /* 右大パーツ */
EnemyInit (3, 0x043a, -32, 0, p); /* 左上小パーツ */
EnemyInit (4, 0x043a, 32, 0, p); /* 右上小パーツ */
break;
case 1: /* 左大パーツ */
EnemyInit (5, 0x043a, 16, 16, p); /* 左下小パーツ */
break;
case 2: /* 右大パーツ */
EnemyInit (6, 0x043a, -16, 16, p); /* 右下小パーツ */
break;
case 3: /* 左上小パーツ */
break;
case 4: /* 右上小パーツ */
break;
case 5: /* 左下小パーツ */
break;
case 6: /* 右下小パーツ */
break;
case 7: /* 中央パーツ */
break;
default:
printf ("enemy_move() : バグってます\n");
break;
}
}
/* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
{
short h;
for (h = 0; h < sp_num; h++) {
p->x = p->lx + p->ox;
p->y = p->ly + p->oy;
if (p->parent != NULL) {
spwork.x = p->x + p->parent->x + parts_table[h].x;
spwork.y = p->y + p->parent->y + parts_table[h].y;
} else {
spwork.x = p->x + parts_table[h].x;
spwork.y = p->y + parts_table[h].y;
}
spwork.pt = parts_table[h].pt;
spwork.info = p->info;
spwork.x += (128 + 16); /* 表示用に補正 */
spwork.y += (128 + 16);
xsp_set_st (&spwork);
fxsp_set_st (&spwork);
spwork.x -= (128 + 16);
spwork.y -= (128 + 16);
}
}
void EnemyMove (void)
{
ENEMY *p, *q;
p = enemy_top;
q = NULL;
while (p != NULL) {
char erase_flag = 0;
switch (p->type) {
case 0: /* 本体 */
DispSp (p, 36, parts0_table);
break;
case 1: /* 左大パーツ */
switch (p->cyc) {
case 0:
if (seq_counter == 2)
p->cyc = 1;
break;
case 1:/* 加速度的に離れる */
if (p->vx > -3.0)
p->vx -= 0.5;
p->lx += p->vx;
if (p->lx < -8.0) {
p->cyc++; /* 次へ */
p->lx = -8.0;
p->ox += p->lx;
p->oy += p->ly;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
}
break;
case 2:/* ばね振動 */
p->vx -= p->lx * P1_K;
/* 摩擦 */
if (p->vx > 0)
p->vx -= P1_M;
else
p->vx += P1_M;
p->lx += p->vx;
if ((fabs (p->vx) < P1_V) && (fabs (p->lx) < P1_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
DispSp (p, 25, parts1_table);
break;
case 2: /* 右大パーツ */
switch (p->cyc) {
case 0:
if (seq_counter == 2)
p->cyc = 1;
break;
case 1:/* 加速度的に離れる */
if (p->vx < 3.0)
p->vx += 0.5;
p->lx += p->vx;
if (p->lx > 8.0) {
p->cyc++; /* 次へ */
p->lx = 8.0;
p->ox += p->lx;
p->oy += p->ly;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
}
break;
case 2:/* ばね振動 */
p->vx -= p->lx * P1_K;
/* 摩擦 */
if (p->vx > 0)
p->vx -= P1_M;
else
p->vx += P1_M;
p->lx += p->vx;
if ((fabs (p->vx) < P1_V) && (fabs (p->lx) < P1_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
DispSp (p, 25, parts2_table);
break;
case 3: /* 左上小パーツ */
switch (p->cyc) {
case 0:
if (seq_counter > P2_S) {
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
}
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = (301 - 305) * p->lz;
p->ly = (125 - 140) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox += (301 - 305);
p->oy += (125 - 140);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P2_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P2_M;
else
p->vz += P2_M;
p->lz += p->vz;
p->lx = (301 - 305) * p->lz;
p->ly = (125 - 140) * p->lz;
if ((fabs (p->vz) < P2_V) && (fabs (p->lz) < P2_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
DispSp (p, 9, parts3_table);
break;
case 4: /* 右上小パーツ */
switch (p->cyc) {
case 0:
if (seq_counter > P2_S) {
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
}
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = -(301 - 305) * p->lz;
p->ly = (125 - 140) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox -= (301 - 305);
p->oy = (125 - 140);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P2_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P2_M;
else
p->vz += P2_M;
p->lz += p->vz;
p->lx = -(301 - 305) * p->lz;
p->ly = (125 - 140) * p->lz;
if ((fabs (p->vz) < P2_V) && (fabs (p->lz) < P2_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
DispSp (p, 9, parts4_table);
break;
case 5: /* 左下小パーツ */
switch (p->cyc) {
case 0:
if (seq_counter > P3_S) {
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
}
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = (301 - 320) * p->lz;
p->ly = (184 - 179) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox += (301 - 320);
p->oy += (184 - 179);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P3_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P3_M;
else
p->vz += P3_M;
p->lz += p->vz;
p->lx = (301 - 320) * p->lz;
p->ly = (184 - 179) * p->lz;
if ((fabs (p->vz) < P3_V) && (fabs (p->lz) < P3_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
DispSp (p, 12, parts5_table);
break;
case 6: /* 右下小パーツ */
switch (p->cyc) {
case 0:
if (seq_counter > P3_S) {
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
}
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = -(301 - 320) * p->lz;
p->ly = (184 - 179) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox -= (301 - 320);
p->oy += (184 - 179);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P3_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P3_M;
else
p->vz += P3_M;
p->lz += p->vz;
p->lx = -(301 - 320) * p->lz;
p->ly = (184 - 179) * p->lz;
if ((fabs (p->vz) < P3_V) && (fabs (p->lz) < P3_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
end_of_data = !0; /* 終わり */
}
break;
default:
break;
}
DispSp (p, 12, parts6_table);
break;
case 7: /* 中央パーツ */
if (seq_counter == 3)
erase_flag = !0;
else
DispSp (p, 12, parts7_table);
break;
default:
printf ("enemy_move() : バグってます\n");
break;
}
if (erase_flag) {
if (q == NULL) { /* リストの一番最初を削除 */
enemy_top = p->next;
p->next = enemy_null_top;
enemy_null_top = p;
q = NULL;
p = enemy_top;
} else {
q->next = p->next;
p->next = enemy_null_top;
enemy_null_top = p;
p = q->next;
}
} else {
q = p;
p = p->next;
}
}
}
void EnemyTini (void)
{
int i;
/* リストをつなげる */
enemy_top = NULL;
enemy_null_top = enemy;
for (i = 0; i < ENEMY_MAX; i++)
enemy[i].next = &enemy[i + 1];
enemy[ENEMY_MAX - 1].next = NULL;
}